package multiThreading;

import javafx.scene.layout.Priority;

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.concurrent.PriorityBlockingQueue;

public class I implements Runnable{
    //优先队列的操作
    private static PriorityQueue<c> q=new PriorityQueue<>();
//    private static PriorityBlockingQueue<c>q=new PriorityBlockingQueue<>();//运用到了阻塞，其实就是单线程的
    @Override
    public void run() {
        ok();
    }
    public static void main(String arg[]){
        I i=new I();
        Thread t=new Thread(i);
        q.add(new c("北京",100));
        q.add(new c("杭州",200));
        q.add(new c("深圳",400));
        q.add(new c("广州",300));
        t.start();
    }
    public void ok(){
//        Object nums[]= q.toArray();//将集合中的元素整合成数组取出
//        Arrays.sort(nums);//如果没有这句话的话，打印出来的就是小顶堆的数据，所以一定要排好序
//        for(int i=0;i<nums.length;i++){
//            c x=(c)nums[i];//把数组中的元素取出，强制转换一下，用于输入该对象的name和number
//            System.out.println(x.getName()+"-"+x.getNumber());
//        }
        while (!q.isEmpty()){
            c x=q.poll();//取出队列的队头元素,同时出队
            System.out.println(x.getName()+"-"+x.getNumber());//每次出队的时候，就已经排好序了！！
        }
//        q.forEach(p->System.out.println(p.getName()+"-"+p.getNumber()));//用lambda表达式也可以输出，但是出来的顺序也还是小顶堆的顺序，和循环输出的一样的
    }
}
class c implements Comparable{
    private String name;
    private Integer number;
    public c(String name,Integer number){
        this.name=name;
        this.number=number;
    }
    @Override
    public int compareTo(Object o) {
        c that=(c)o;
        return this.number.compareTo(that.number);//在这里排序，把number小的排在前面
    }
    public String getName() {
        return name;
    }

    public Integer getNumber() {
        return number;
    }
}

